package org.arquimedes.servicios;

import java.io.*;


import java.net.*;
import org.arquiemedes.utilitarios.Constantes;
import org.arquimedes.dispatcher.Replicador;

public class ServicioRecibirMensaje {

	private static int PUERTO;
	private static String conection = "";
	private static ServicioRecibirMensaje solitario = null;

	/**
	 * Se define como el solitario
	 * @return
	 */
	public static ServicioRecibirMensaje getServicio() {
		if (solitario == null) {
			solitario = new ServicioRecibirMensaje();
		}
		return solitario;
	}

	public ServicioRecibirMensaje() {
		PUERTO = Integer.valueOf(ServicioPropiedades.getServicio().obtenerPropiedad(Constantes.PUERTO));
	}

	public void iniciarServicio() {
		Socket skCliente = null;
		try {

			ServerSocket skServidor = new ServerSocket(PUERTO);
			System.out.println("Escucho el puerto " + PUERTO);
			while (conection.equals("")) {
                            block:{
				skCliente = skServidor.accept();
				String ip = (String) skCliente.getInetAddress().getHostAddress();
				if (ServicioLNegra.getServicio().isListaNegra(ip)) {
					// Si esta en la lista negra, continua el ciclo para aceptar otra conexion
					break;
				}
				ObjectInputStream bufferObjetos = new ObjectInputStream(skCliente.getInputStream());

				String data = (String) bufferObjetos.readObject();

				if (!data.contains(Constantes.SOLICITUDTRAMA)) {
					byte[] encKey = (byte[]) bufferObjetos.readObject();
					byte[] sigToVerify = (byte[]) bufferObjetos.readObject();

					Replicador.obtenerReplicador().replicarTrama(encKey, sigToVerify, ip);

				} else {
					
                                     ObjectOutputStream bufferObjetos2 = new ObjectOutputStream(skCliente.getOutputStream());                           
                                     bufferObjetos2.writeObject(ServicioSolicitarTrama.getServicio().solicitarTrama(data));
                                    
                                        
                                }
                                skCliente.close();
                            }
                            
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}
}
